"""
    2021-08-08  15:09   by  炸天帮成员
    从pandas的报错信息可以看出，pandas内部也是通过xlrd、openpyxl进行excel对文件的读写。
    DataFrame默认使用第一行作为列索引，
    而行索引默认是从0开始的。
"""
import pandas
import xlrd         #   pandas打开.xls文件时需要使用xlrd
import openpyxl     #   pandas打开.xlsx文件时需要使用openpyxl

excel_PATH_1 = r"D:\Python_Pandas_Learn\_2_pandas_read_excel\pandas_test_0.xls"
df_1 = pandas.read_excel(excel_PATH_1)      #   打开.xls文件,默认打开第一个Sheet,及Sheet1。
print("df=\n",df_1)
#   指定打开.xls下的某个具体的sheet
df_1_sheet2 = pandas.read_excel(excel_PATH_1,sheet_name="Sheet2")
print("df_1_sheet2=\n",df_1_sheet2)
#   指定.xls下的某个具体的sheet中的某一列 作为其他行的index(行索引) 进行显示输出。(即把原来的默认的Index用某一列替换)
df_1_sheet1_col = pandas.read_excel(excel_PATH_1,sheet_name="Sheet1",index_col = 1)
print("df_1_sheet2_col=\n",df_1_sheet1_col)
#   指定.xls下的某个具体的sheet中的某一行 作为自该行起的其他列的header(列索引)进行显示输出。(即把原来的默认的header用某一行替换)
df_1_sheet1_header = pandas.read_excel(excel_PATH_1,sheet_name="Sheet1",header = 1)
print("df_1_sheet2_header=\n",df_1_sheet1_header)

#   指定.xls导入列：有些列没必要导入，我们只需要导入我们想要的列即可。
df_1_sheet1_col_0_4 = pandas.read_excel(excel_PATH_1,sheet_name="Sheet1",usecols = [0,4])
print("df_1_sheet1_col_0_4=\n",df_1_sheet1_col_0_4) #   只导入第0列和第4列。
#   读取.xls的前几行。
df_1_sheet1_row_0_2 = pandas.read_excel(excel_PATH_1,sheet_name="Sheet1",nrows = 2)
print("df_1_sheet1_row_0_2=\n",df_1_sheet1_row_0_2) #   只导入前2行。



#   上方为.xls文件。
#----------
#   下方为.xlsx文件。
excel_PATH_2 = r"D:\Python_Pandas_Learn\_2_pandas_read_excel\pandas_test_1.xlsx"
df_2 = pandas.read_excel(excel_PATH_2)      #   打开.xlsx文件,默认打开第一个Sheet,及Sheet1。
print("df_2=\n",df_2)
#   指定打开.xlsx下的某个具体的sheet。
df_2_sheet2 = pandas.read_excel(excel_PATH_2,sheet_name="Sheet2")
print("df_2_sheet2=\n",df_2_sheet2)

#   .xlsx也可以进行上述.xls的操作，这里不再重复书写。

#----------
#   下方为利用head()显示已经被加载的DataFrame中的前几行。
print("df_2.head = \n",df_2.head(2))    #显示除了第一行(第一行在pandas中默认为 列索引)之外的，前2行。

#----------
#   下方为使用shape()获取数据表的行、列数。
#   注意Python中利用shape方法获取行数和列数时，不会把行索引和列索引计算在内。
print("df_2.shape = \n",df_2.shape)

#----------
#   下方为查看数据表中的类型。
print("df_2.info = \n",df_2.info())
#   NaN（即excel中的缺失值）的数量，会在.info()被显示为 x(个数) non-null。
#   我们可以通过 isnull()方法来判断哪个值是缺失值。如果是缺失值，则返回True。
print("df_2.info = \n",df_2.isnull())

#----------
#   使用dropna()删除含有NaN的行，默认是 只要某一行有缺失值就把这一行删除。
#   若往dropna()方法中传入一个参数how = "all"，那么就只会删除 全为空值的 行。
print("df_2.dropna() = \n",df_2.dropna())
print("df_2.dropna(how = \"all\") = \n",df_2.dropna(how = "all"))